From 3dc78b8e68ca4cc167e6f118edf35766075ebc5c Mon Sep 17 00:00:00 2001 From: YAMAMOTO Mitsuharu Date: Tue, 19 May 2009 00:26:46 +0000 Subject: [PATCH] (x_delete_display): Don't call XrmDestroyDatabase here. (x_delete_terminal): Dissociate resource database from display and then call XrmDestroyDatabase before closing display. --- src/xterm.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/xterm.c b/src/xterm.c index f12250085ee..ec6c4d4011f 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -10613,13 +10613,6 @@ x_delete_display (dpyinfo) tail->next = tail->next->next; } - /* Xt and GTK do this themselves. */ -#if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK) -#ifndef AIX /* On AIX, XCloseDisplay calls this. */ - XrmDestroyDatabase (dpyinfo->xrdb); -#endif -#endif - xfree (dpyinfo->x_id_name); xfree (dpyinfo->x_dnd_atoms); xfree (dpyinfo->color_cells); @@ -10740,6 +10733,20 @@ x_delete_terminal (struct terminal *terminal) x_destroy_all_bitmaps (dpyinfo); XSetCloseDownMode (dpyinfo->display, DestroyAll); + /* Whether or not XCloseDisplay destroys the associated resource + database depends on the version of libX11. To avoid both + crash and memory leak, we dissociate the database from the + display and then destroy dpyinfo->xrdb ourselves. */ +#ifdef HAVE_XRMSETDATABASE + XrmSetDatabase (dpyinfo->display, NULL); +#else + dpyinfo->display->db = NULL; +#endif + /* We used to call XrmDestroyDatabase from x_delete_display, but + some older versions of libX11 crash if we call it after + closing all the displays. */ + XrmDestroyDatabase (dpyinfo->xrdb); + #ifdef USE_GTK xg_display_close (dpyinfo->display); #else -- 2.30.2